package com.tb.utils;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

public class SendMailUtil{

    /**
     * 添加自己的邮箱号
     */
    private  String myEmailAccount = "17809276647@163.com";
    /**
     * 这个是邮箱密码，密码是邮箱的授权码
     */
    private  String myEmailPassword = "741720390hl";

    /**
     * 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
     */
    private  String myEmailSMTPHost = "smtp.163.com";
    /**
     * 收件人邮箱（替换为自己知道的有效邮箱）
     */
    private  String receiveMailAccount = null;

    //随机验证码
    private String email_code=null;

    public SendMailUtil() {
        super();
    }

    public static boolean sendEmail(String email,String code){
        SendMailUtil sendMailUtil=new SendMailUtil();
        sendMailUtil.email_code=code;
        try {
            sendMailUtil.fs_email(email);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    public  void fs_email(String str) throws Exception {
        //传入收件人邮箱
        this.receiveMailAccount=str;
        //产生随机验证码存入发送内容
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.host", this.myEmailSMTPHost);
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.ssl.enable", "true" );

        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");

         //2.创建邮件服务
        Session session = Session.getDefaultInstance(props);
         // 设置为debug模式, 可以查看详细的发送 log
        session.setDebug(true);

        // 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session, this.myEmailAccount, this.receiveMailAccount);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
        //
        //    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
        //           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
        //           类型到对应邮件服务器的帮助网站上查看具体失败原因。
        //
        //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
        //           (1) 邮箱没有开启 SMTP 服务;
        //           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
        //           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
        //           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
        //           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
        //
        //    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
        transport.connect(this.myEmailAccount, this.myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session 和服务器交互的会话
     * @param sendMail 发件人邮箱
     * @param receiveMail 收件人邮箱
     */
    private  MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {

        //创建邮件内容

        String emailhtml="<div class=\"con\" style=\"background: #212224;height: 780px; font-size: 26.67vh;\">\n" +
                "    <div class=\"header\" style=\"width: 100%;height: 80px;background: #323437;position: relative;\">\n" +
                "        <a href=\"javascript:;\" style=\"display: block;position: absolute;top:0;right: 0;bottom:0;left: 0;margin: auto;\">\n" +
                "            <img src=\"http://pky36u4fr.bkt.clouddn.com/logo.png\" style=\"position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;\"\n" +
                "                alt=\"\">\n" +
                "        </a>\n" +
                "    </div>\n" +
                "    <div class=\"main\" style=\" width: 100%;height:500px;box-sizing: border-box; padding: 50px; color: #ccc;\">\n" +
                "        <h1 style=\"font-size: 0.15em; font-weight: bold;margin-bottom: 0.12em;\">尊敬的用户[\n" +
                "            <a href=\"javascript:;\" style=\"font-size: 1.2em;color: skyblue;\">"+this.receiveMailAccount+"</a>\n" +
                "            ]您好:\n" +
                "        </h1>\n" +
                "        <h2 style=\"font-size: 0.12em; font-weight: bold; margin-bottom: 0.12em;text-indent: 0.12em;\">您的验证码为<br />\n" +
                "            <span style=\"display: table;border: 1px solid #1dd3d3;text-indent: 0;text-align: center;font-size: 1.2em;line-height: 1.2em;padding: .5em 1.2em; margin: 1.2em  0 1.2em 1.2em; color: #1dd3d3;\">"+this.email_code+"</span>\n" +
                "        </h2>\n" +
                "        <h2 style=\"font-size: 0.12em;font-weight: bold;margin-bottom: 0.12em;text-indent: 0.12em;\">请在十分钟内进行验证。</h2>\n" +
                "        <h2 style=\"font-size: 0.12em;font-weight: bold;margin-bottom: 0.12em;text-indent: 0.12em;\">本邮件为系统自动发送，请勿回复。</h2>\n" +
                "        <h3 style=\" font-size: 0.12em;font-weight: bold; padding-top: 1.2em; text-align: right;\">TopBuy(淘买)商城</h3>\n" +
                "    </div>\n" +
                "</div>";

        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人
        message.setFrom(new InternetAddress(sendMail, "淘买商城", "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));

        // 4. Subject: 邮件主题
        message.setSubject("欢迎注册为淘买用户 ", "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）
        message.setContent(emailhtml, "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }


}